/*
 * 描          述:  <描述>
 * 修  改   人:  PengQingyang
 * 修改时间:  2022年5月17日
 * <修改描述:>
 */
package com.tx.component.sendsms.context;

import java.util.List;

import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.factory.InitializingBean;

import com.tx.component.communication.exceptions.SendSMSException;
import com.tx.component.communication.model.SendResult;
import com.tx.component.sendsms.model.SendSMSWithTemplateRequest;
import com.tx.component.sendsms.plugin.SendSMSWithTemplateHandler;

/**
 * 通过短信模板发送短信处理器组合类实现<br/>
 * <功能详细描述>
 * 
 * @author  PengQingyang
 * @version  [版本号, 2022年5月17日]
 * @see  [相关类/方法]
 * @since  [产品/模块版本]
 */
public class SendSMSWithTemplateHandlerComposite implements InitializingBean {
    
    //需要考虑动态加载
    /** 通过模板发送短信处理器 */
    private List<SendSMSWithTemplateHandler> handlers;
    
    /**
     * @throws Exception
     */
    @Override
    public void afterPropertiesSet() throws Exception {
        
    }
    
    /**
     * 使用模板发送短信<br/>
     * <功能详细描述>
     * @param request
     * @return [参数说明]
     * 
     * @return SendResult [返回类型说明]
     * @exception throws [异常类型] [异常说明]
     * @see [类、类#方法、类#成员]
     */
    public SendResult sendWithTemplate(SendSMSWithTemplateRequest request) {
        if (CollectionUtils.isEmpty(this.handlers)) {
            return SendResult.newFail(
                    "短信发送处理器为空，需在application.yml 中 communication.sms.aliyun or juhe... set true.");
        }
        SendSMSWithTemplateHandler handler = null;
        for (SendSMSWithTemplateHandler h : this.handlers) {
            if (!h.isEnable()) {
                continue;
            }
            if (h.supports(request)) {
                handler = h;
            }
        }
        if (handler == null) {
            return SendResult.newFail(
                    "短信发送处理器为空，需在application.yml 中 communication.sms.aliyun or juhe... set true.");
        }
        try {
            SendResult result = handler.sendWithTemplate(request);
            return result;
        } catch (SendSMSException e) {
            throw e;
        } catch (Exception e) {
            throw new SendSMSException(e.getMessage(), e);
        }
    }
    
    /**
     * @return 返回 handlers
     */
    public List<SendSMSWithTemplateHandler> getHandlers() {
        return handlers;
    }
    
    /**
     * @param 对handlers进行赋值
     */
    public void setHandlers(List<SendSMSWithTemplateHandler> handlers) {
        this.handlers = handlers;
    }
}
